#include <REGX52.H>
#include "TIMER0.H"
#include "INT0.H"
#include "IR.h"
#include "LCD1602.H"

//接收到起始信号
unsigned char state=0;//用来记录信号变化，0-1之间变化的时间用定时器计算
unsigned int num=0;//用来记录两个下降沿之间的时间间隔
unsigned char into_count=0;
unsigned char m_data[4]={0};//用来存储数据
unsigned char repeat_flag=0;
unsigned char over_flag=0;


void IR_init()
{
	Timer0_Init();//用来计数
	Int0_Init();//用来下降沿中断
}
unsigned char Return_Over_Data()
{
	if(over_flag)
	{
		over_flag=0;
		return 1;
	}
	return 0;
}
unsigned char Return_Repeat_Data()
{
	if(repeat_flag)
	{
		repeat_flag=0; 
		return 1;
	}
	return 0;
}
unsigned char Return_Adress_Data()
{
	return m_data[3];
}
unsigned char Return_Command_Data()
{
	return m_data[1];
}

void Int0_interrupt() interrupt 0//每个下降沿进入一次
{
	if(state==0)//第一次下降沿会进入这个
	{
		state=1;
		Set_Time(0);
	}
	else if(state==1)
	{
		num=Get_Time();//微秒变毫秒
		Set_Time(0);//立马开始新一次计数
		if((num>12442-500)&&(num<12442+500))
		{
			state=2;
		}
		else if((num>10368-500)&&(num<10368+500))//重复信号
		{
			repeat_flag=1;
			state=0;
		}
	}
	else if(state==2)
	{
		num=Get_Time();//微秒变毫秒
		Set_Time(0);//立马开始新一次计数
		if((num>1032-500)&&(num<1032+500))
		{
			m_data[3-(into_count/8)]&=~(0x01<<(into_count%8));
			into_count++;
		}
		else if((num>2074-500)&&(num<2074+500))
		{
			m_data[3-(into_count/8)]|=(0x01<<(into_count%8));
			into_count++;
		}
		if(into_count==32)
		{
			over_flag=1;
			into_count=0;
			state=0;
		}
	}
}